#ifndef DW_COMMAND_LINE_H
#	define DW_COMMAND_LINE_H

#include <map>
#include <string>

namespace dw {
	namespace system {

class CommandLine
{
public :
	CommandLine() { ; }

public :
	template< typename T >
	void RegisterParameter(const std::string& name, const T& defaultValue);
	void RegisterOption(const std::string& name, bool defaultValue = false);

	void Parse(int argc, char** argv);

	template< typename T >
	T GetParameterValue(const std::string& name);

private :
	class ParameterBase
	{
	public :
		virtual void SetValueFromString(const std::string& str) = 0;
		virtual std::string GetValueToString() const = 0;
	};

	template< typename T >
	class Parameter : public ParameterBase
	{
	public :
		explicit Parameter(const T& value) : _value(value) { ; }

	public :
		void SetValueFromString(const std::string& str);
		std::string GetValueToString() const ;

		void SetValue(const T& value) { _value = value; }
		const T& GetValue() { return _value; }

	private :
		T _value;
	};

	typedef std::map< std::string, bool > OptionCollection;
	typedef std::map< std::string, ParameterBase* > ParameterCollection;

	ParameterCollection _parameters;
};

	} // namespace system
} // namespace dw

#include "system/commandline.inl"

#endif // !DW_COMMAND_LINE_H
